package 单无人机架次;
import GA_Test.GAData;
import 多无人机架次.Capcity;
import 多无人机架次.Distance;
import 多无人机架次.Node;


import java.util.ArrayList;
import java.util.Random;

public class FullGreedy {

    public static Object[] mainMethod() {
        ArrayList<Integer> truck_node = new ArrayList<Integer>(); //卡车要访问的节点集
        ArrayList<Integer> drone_node = new ArrayList<Integer>();//无人机要访问的节点集
        ArrayList<Integer> drone_route = new ArrayList<Integer>();//无人机访问路径
        ArrayList<Integer> truck_route = new ArrayList<Integer>();//车辆访问路径

        ArrayList<Object> drone_hub = new ArrayList<>();//hub是一个中转的集合

        ArrayList<Object> truck_hub = new ArrayList<>();//hub是一个中转的集合


        //Node[] n_size = ReadDate.ReadNode(); //获取顾客点信息
        for (Integer c = 1; c < GAData.cusInfo.length - 1; c++) { //初始将所有的顾客节点 加入未访问节点集w
            drone_node.add(GAData.cusInfo[c].id);
            truck_node.add(GAData.cusInfo[c].id);

        }
        car:
        for (int i = 0; i < 10; i++) {//车辆选择循环 什么时候终止呢   应该是车辆访问节点为空时  这就要 车辆访问节点只要删除   就要判断

            Random random = new Random();
            Integer the_first_point = drone_node.get(random.nextInt(drone_node.size()));
            //先为无人机安排顾客点  获取距离原点最近的点 作为首次起飞点
            //Integer closest_0_point = Distance.wDistance1(0, drone_node);
            /*
            1、初始节点的处理
             */
            drone_route.add(the_first_point);
            drone_node.remove(the_first_point);
            truck_route.add(the_first_point);
            truck_node.remove(the_first_point);
            //2、生成无人机路径并存储
            int drone_capaticy = 0;
            int drone_flytime = 0;
            int drone_serCap = 0;
            dronewhile:while (true) {
                if (drone_node.size() > 0) {
                    Integer in = Distance.wDistance1(drone_route.get(drone_route.size() - 1), drone_node);
                    drone_route.add(in);
                    drone_node.remove(in);
                    drone_capaticy = Capcity.Uzz(drone_route);
                    drone_flytime = Capcity.fD(drone_route);

                    if (drone_capaticy > GAData.capacityDrone || drone_flytime >= GAData.distanceDrone) {
                        Integer out = drone_route.get(drone_route.size() - 1);
                        drone_route.remove(out);
                        drone_node.add(out);
                        break;
                    }

                } else {//这里需要判断 drone route中的节点数目  分为2个和两个以上
                    break;

                }
            }

            if(drone_route.size()>2) {
                drone_hub = StoreMethod.Store(drone_hub, drone_route);
                //把无人机服务的点从车辆节点中删除
                for (int m = 1; m < drone_route.size() - 1; m++) {
                    truck_node.remove(drone_route.get(m));
                }
            }

            //这里要把无人机服务顾客点的载重算出来 为后面计算车辆载重约束提供数据
            drone_serCap = Capcity.drone_service(drone_route);

            drone_route.clear();
            //3、开始为车辆寻找访问节点

            while (true) {
                if(truck_node.size()>0) {
                    Integer in = Distance.wDistance1(truck_route.get(truck_route.size() - 1), truck_node);
                    truck_route.add(in);
                    truck_node.remove(in);
                    drone_node.remove(in);
                    int truck_capacity = drone_serCap + Capcity.truck_service(truck_route);
                    if (truck_capacity > GAData.capacityTruck) {
                        Integer out = truck_route.get(truck_route.size() - 1);
                        truck_route.remove(out);
                        truck_node.add(out);
                        drone_node.add(out);
                        break;
                    }
                }else{
                    truck_hub.add(truck_route);
                    break car;
                }
            }
            //这里应该去 干啥呢 我想想  应该是 现在 第一辆车与第一架无人机都已经安排完了   这个时候可以给第二辆车开始安排了  车辆的行驶路径要不要 存储起来呢
            truck_hub=StoreMethod.Store(truck_hub,truck_route);
            truck_route.clear();
            continue car;
        }
         //调用打印方法  把 drone_hub 和 truck hub 传进去  这个打印方法这里可以用来查看初始解的内容
        Print.print(truck_hub,drone_hub);
        //调用存储方法将 truck和drone 存储到 一个数组中
        Object[] obj = new Object[2];
        obj[0]=truck_hub; obj[1] = drone_hub;
        return obj;
    }
}